home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / pc / files / t_unix / bs941029.tgz / bbsx-941029.tar / bbsx / bbs_develop.c < prev    next >
C/C++ Source or Header  |  1994-10-29  |  5KB  |  274 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <string.h>
  7. #include <fcntl.h>
  8. #include <signal.h>
  9. #include <time.h>
  10. #include <termios.h>
  11. #include <sys/socket.h>
  12.  
  13. #include "bbs.h"
  14.  
  15. #ifdef BOXBIN
  16.  
  17. int get_key()
  18. {
  19.   int ch;
  20.   static struct termio save, set;
  21.   
  22.   
  23.   ioctl(0, TCGETA, &save);
  24.   set = save;
  25.   set.c_lflag &= !ICANON; 
  26.   set.c_lflag &= !ECHO;
  27.   set.c_iflag  = 0;
  28.   set.c_cc[VMIN] = 1;
  29.   set.c_cc[VTIME] = 0;
  30.   ioctl(0, TCSETA, &set);
  31.   read(0, &ch, 1);
  32.   ioctl(0, TCSETA, &save);
  33.   signal(SIGINT,interrupt_handler);
  34.   signal(SIGQUIT,interrupt_handler);
  35.   
  36.   return ch;
  37. }  
  38. #endif
  39.  
  40. #ifdef BOXBIN
  41.  
  42. int send_binary(struct mail *mail, char *line)
  43. {
  44.   char buffer[1024];
  45.   char filename[50];
  46.   long now;
  47.   char ch;
  48.   FILE *pip, *fp;
  49.   int fl, old_1;
  50.   long bytes;
  51.   int i,j, abort_len;
  52.   unsigned int crc=0;
  53.   unsigned int msg_crc;
  54.   static struct termio save, set;
  55.  
  56.   i = sscanf(line,"#BIN#%d#|%d",&bytes,&msg_crc);
  57.   if (i != 2) {
  58.     if (level != MBOX) {
  59.       puts("WARNING: No binary reading");
  60.     }  
  61.     return 1;
  62.   } 
  63.   puts("#OK#");
  64.  
  65.   sprintf(buffer,"%s BBS.%d",UUENCODE,getpid()); 
  66.   
  67.   sprintf(filename,"%s%d","/tmp/BBS.",getpid());
  68.   fl = open(filename,O_CREAT | O_WRONLY, 0600);
  69. /*  old_1=dup(1);
  70.   dup2(fl, 1);
  71.  
  72.   if ((pip=popen(buffer,"wb")) == NULL) {
  73.     halt();
  74.   } */
  75.  
  76.   *buffer= 0;
  77.   abort_len = strlen("#ABORT#");
  78.  
  79.   signal(SIGINT, SIG_IGN);
  80.   signal(SIGQUIT, SIG_IGN);
  81.   ioctl(0, TCGETA, &save);
  82.   set = save;
  83.   set.c_lflag &= ~ICANON; 
  84.   set.c_lflag &= ~ECHO;
  85.   set.c_lflag &= ~ECHONL;
  86.   set.c_iflag != IGNBRK;
  87.   set.c_iflag != IGNPAR;
  88.   set.c_iflag &= ~INLCR;
  89.   set.c_cc[VMIN] = 1;
  90.   set.c_cc[VTIME] = 0;
  91.   set.c_oflag = ~OPOST;
  92.   ioctl(0, TCSETA, &set);
  93.   
  94.   for(i=0; i < bytes; i++) {
  95.     read(0, &ch, 1);
  96.     if (level != MBOX) {
  97.       if (strlen(buffer) < abort_len) {
  98.         buffer[strlen(buffer)+1] = 0;
  99.         buffer[strlen(buffer)] = ch;
  100.       } else 
  101.       {
  102.         for(j=0; j < abort_len - 1; j++) {
  103.           buffer[j] = buffer[j+1];
  104.         }
  105.         buffer[j] = ch;
  106.         buffer[abort_len] = 0;
  107.       }  
  108.       if (!strcmp(buffer,"#ABORT#")) {
  109. /*        pclose(pip);
  110.         close(1);
  111.         dup2(old_1, 1);
  112.         close(old_1); */
  113. #ifdef NICHT_JETZT
  114.         unlink(filename);
  115. #endif        
  116.         ioctl(0, TCSETA, &save);
  117.         
  118.         puts("Binarytransmission aborted"); 
  119.         
  120.         signal(SIGINT,interrupt_handler);
  121.         signal(SIGQUIT,interrupt_handler);
  122.  
  123.         return 2;  
  124.       } 
  125.     }       
  126.     write(fl,&ch,1);
  127. printf("get char 0x%x\n",ch);    
  128.     crc = do_crc(&ch,1,crc);
  129.   }  
  130.  
  131.   
  132.   ioctl(0, TCSETA, &save);
  133.   signal(SIGINT,interrupt_handler);
  134.   signal(SIGQUIT,interrupt_handler);
  135.  
  136. /*  close(1);
  137.   pclose(pip);  
  138.   dup2(old_1, 1);
  139.   close(old_1); */
  140.   
  141.   close(fl);
  142.  
  143.   if (crc != msg_crc) {
  144. #ifdef NICHT_JETZT
  145.     unlink(filename);
  146. #endif      
  147.     if (level != MBOX) {
  148.       printf("\n*** checksum error! message not stored.\n\n");
  149.       return 2;
  150.     }
  151.     else exit(0);
  152.   }  
  153.       
  154.   printf("#OK#%d\n",crc);
  155.  
  156.   sprintf(buffer,"#UUENCODE%s",line);
  157.   append_line(mail, buffer);  
  158.   
  159.   if ((fp = fopen(filename,"rb")) == NULL) halt();
  160.   while(!feof(fp)) {
  161.     fread(buffer, 1024, 1, fp);
  162.     append_line(mail, buffer);
  163.   }
  164.   fclose(fp);  
  165.   unlink(filename);
  166.   
  167.   return 0;
  168. }
  169.  
  170. #endif
  171.  
  172. #ifdef BOXBIN
  173.  
  174. int init_crc()
  175. {
  176.   int i,j;
  177.   
  178.   for (i = 0; i < 256; i++) {
  179.     crctab[i] = 0;
  180.     for (j = 0; j < 8; j++) {
  181.       if ((bittab[j] & i) != 0) {
  182.         crctab[i] = crctab[i] ^ crcbit[j];
  183.       }
  184.     }
  185.   }
  186. }
  187. #endif
  188.  
  189. #ifdef BOXBIN
  190.  
  191. int do_crc(char *buf, int n, unsigned int crc)
  192. {
  193.   while (--n >= 0)
  194.     crc = (crctab[(crc >> 8)] ^ ((crc << 8) | *buf++)) & 0xffff;
  195.   return (crc);
  196. }
  197.  
  198. #endif
  199.  
  200. #ifdef BOXBIN
  201.  
  202. int uudecode(FILE *fp, char *line)
  203. {
  204.   int i, buf_size, fl;
  205.   FILE *pip;
  206.   char filename[50];
  207.   char buffer[1024];
  208.   char ch;
  209.   unsigned int crc=0;
  210.   static struct termio save, set;
  211.   
  212.   fgets(buffer, sizeof(buffer), fp);
  213.   i = sscanf(buffer,"%*s %*s %s\n",filename);
  214.   if ((pip=popen(UUDECODE,"wb")) == NULL) {
  215.     halt();
  216.   }
  217.   sprintf(filename,"/tmp/BBS.%d",getpid());
  218.   sprintf(buffer,"begin 600 %s\n",filename);
  219.   fputs(buffer, pip);
  220.   buf_size = sizeof(buffer);
  221.   while(fgets(buffer, buf_size,fp)) {
  222.    fputs(buffer, pip);
  223.   }  
  224.   pclose(pip);  
  225.  
  226.   if((fl=open(filename, O_RDONLY)) == -1) halt();
  227.   puts(line);
  228.  
  229.   gets(buffer);
  230.   if(strcmp(buffer,"#OK#")) {
  231.     close(fl);
  232.     unlink(filename);
  233.     return 0;
  234.   } 
  235.   
  236.   signal(SIGINT, SIG_IGN);
  237.   signal(SIGQUIT, SIG_IGN);
  238.   
  239.   ioctl(0, TCGETA, &save);
  240.   set = save;
  241.  
  242.   set.c_lflag &= ~ICANON; 
  243.   set.c_lflag &= ~ECHO;
  244.   set.c_lflag &= ~ECHONL;
  245.   set.c_lflag &= !ISIG;
  246.   set.c_iflag  = 0;
  247.   set.c_cc[VMIN] = 1;
  248.   set.c_cc[VTIME] = 0;
  249.   set.c_oflag = 0;
  250.   
  251.   ioctl(0, TCSETA, &set); 
  252.  
  253.  
  254.  
  255.   while((i=read(fl,&ch,1)) && (i != -1)) {
  256.     putchar(ch);
  257.     crc = do_crc(&ch,1,crc);
  258.   }  
  259.   
  260.   signal(SIGINT,interrupt_handler);
  261.   signal(SIGQUIT,interrupt_handler);
  262.   
  263.   close(fl);
  264.   unlink(filename); 
  265.   ioctl(0, TCSETA, &save); 
  266.   
  267.   printf("\n");
  268.   
  269.   return 0;
  270. }
  271.  
  272. #endif
  273.  
  274.